home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / ops5c.zip / O5C.H < prev    next >
C/C++ Source or Header  |  1990-05-16  |  17KB  |  798 lines

  1.  
  2. /* start O5C_H */
  3.  
  4. /* start DL_LIST_DEF */
  5.  
  6. struct dll_entry {
  7.     struct dll_entry *next;
  8.     struct dll_entry *prev;
  9. };
  10.  
  11. typedef struct dll_entry    DLL_Entry;
  12.  
  13. typedef DLL_Entry * List;
  14.  
  15. #define SORTED        1
  16. #define UNSORTED    2
  17. #define HEAD        3
  18. #define TAIL        4
  19.  
  20.  
  21. extern void ReInitList();
  22. extern DLL_Entry *FindNode();
  23. extern void InsertNode();
  24. extern void RemoveNode();
  25. extern int CopyList();
  26. extern void UnlinkNode();
  27.  
  28. #define NextNode(node)        ((node)->next)
  29. #define PrevNode(node)        ((node)->prev)
  30.  
  31.  
  32. /* start HASH_TAB_DEF */
  33.  
  34. typedef DLL_Entry HT_Entry_Header;
  35.  
  36. struct hash_tab {
  37.     int ht_size;
  38.     int scan_bucket;
  39.     HT_Entry_Header *scan_entry;
  40.     HT_Entry_Header *bucket[1];
  41. };
  42.  
  43. typedef struct hash_tab *    HashTable;
  44.  
  45. typedef struct {
  46.     HT_Entry_Header link;
  47.     long key;
  48. } Std_Bucket_Entry;
  49.  
  50.  
  51. extern void InitHashTable();
  52. extern HashTable MakeHashTable();
  53. extern HT_Entry_Header *FindEntry();
  54. extern void AddEntry();
  55. extern void RemoveEntry();
  56. extern void ResetHTScan();
  57. extern HT_Entry_Header *ScanHT();
  58.  
  59. #define RemoveHTEntry(node)        RemoveNode(node)
  60.  
  61.  
  62. /* start DYN_MEM_H */
  63.  
  64. struct String {
  65.     long use_count;
  66.     char strg[1];
  67. };
  68.  
  69. /* start DYN_MEM_DEF */
  70.  
  71. typedef struct String *        StrID;
  72.  
  73. extern StrID StrAlloc();
  74. extern void StrFree();
  75.  
  76. /* start TYPES_H */
  77.  
  78. #define USHORT unsigned short
  79. #define BOOLEAN int
  80. #define ULONG unsigned long
  81. #define PTR char *
  82. #define BYTE unsigned char
  83. #define UBYTE unsigned char
  84. #define UCHAR unsigned char
  85.  
  86. #define TRUE        (-1)
  87. #define FALSE        (0)
  88.  
  89. #include <stdio.h>
  90.  
  91. typedef union {
  92.         StrID string;
  93.         int ival;
  94.         float fval;
  95.         FILE *file;
  96.     } Data;
  97.  
  98. typedef long TimeTag;
  99.  
  100. /* start WME_H */
  101.  
  102. struct attribute {
  103.     UBYTE type;
  104.     Data data;
  105. };
  106.  
  107. struct wme {
  108.     TimeTag time;
  109.     int class_index;
  110.     int inst_ref_cnt;
  111.     PTR del_list;
  112.     USHORT attr_cnt;
  113.     struct attribute attr[1];
  114. };
  115.  
  116.  
  117. /* start WME_DEF */
  118.  
  119. typedef struct attribute *    AttrID;
  120. typedef struct wme *        WmeID;
  121.  
  122. #define MAX_WME_ATTR        128
  123.  
  124. #define UNKNOWN_CLASS        (-1)
  125. #define NULL_CLASS        (-2)
  126. #define ALL_CLASS        (-3)
  127.  
  128. extern WmeID CreateWme();
  129. extern int MatchClass();
  130. extern AttrID SetWmeAttr();
  131. extern void RemoveWme();
  132. extern void SetNil();
  133. extern void PrintWme();
  134.  
  135. #define ClearWme(wme_id)        SetNil(wme_id->attr,wme_id->attr_cnt)
  136.  
  137. #define GetWmeClass(wme_id)        (wme_id->class_index)
  138.  
  139. #define SetWmeClass(index)        wme_id->class_index = index
  140.  
  141. #define GetWmeAttr(wme_id,offset)    wme_id->attr[offset]
  142.  
  143. #define GetWmeAttrID(wme_id,offset)    (&(wme_id->attr[offset]))
  144.  
  145. #define GetAttrType(attr_id)        ((attr_id)->type)
  146.  
  147. #define SetAttrType(attr_id,attr_type)    (attr_id)->type=attr_type
  148.  
  149. #define GetAttrString(attr_id)        GetString((attr_id)->data.string)
  150.  
  151. #define GetAttrStrID(attr_id)        ((attr_id)->data.string)
  152.  
  153. #define SetAttrStrID(attr_id,str_id)    (attr_id)->data.string=str_id
  154.  
  155. #define GetAttrInteger(attr_id)        ((attr_id)->data.ival)
  156.  
  157. #define SetAttrInteger(attr_id,inum)    (attr_id)->data.ival=inum
  158.  
  159. #define GetAttrFloat(attr_id)        ((attr_id)->data.fval)
  160.  
  161. #define SetAttrFloat(attr_id,fnum)    (attr_id)->data.fval=fnum
  162.  
  163. #define GetTimeTag(wme_id)        (wme_id->time)
  164.  
  165. #define SetTimeTag(wme_id,value)    wme_id->time=value
  166.  
  167. /* back to types.h */
  168.  
  169. typedef struct attribute Attr;
  170.  
  171. typedef Attr Atom;
  172.  
  173. #define AT_FILE            '\000'
  174. #define AT_FLOAT        '\002'
  175. #define AT_INTEGER        '\003'
  176. #define AT_SYMBOL        '\005'
  177. #define AT_FLOAT_ATOM        '\006'
  178. #define AT_INTEGER_ATOM        '\007'
  179.  
  180. #define is_at_numeric(x)        ((x & '\002') == '\002')
  181. #define is_at_symbolic(x)        ((x & '\004') == '\004')
  182.  
  183. extern char *malloc();
  184. extern char *calloc();
  185.  
  186.  
  187. /* start ACTION_DEF */
  188.  
  189. extern void AddExecQ();
  190. extern void RemoveExecQ();
  191. extern int FetchExecQ();
  192. extern void AddRemoveQ();
  193. extern void AddRemoveQ2();
  194. extern WmeID FetchRemoveQ();
  195. extern void PrintAtom();
  196. extern int GetPosNum();
  197. extern void Rjust();
  198. extern void Tabto();
  199. extern void ColumnUpdate();
  200.  
  201. extern FILE *Openfile();
  202. extern void Closefile();
  203. extern BOOLEAN Default();
  204. extern void rhs_openfile();
  205. extern void rhs_closefile();
  206. extern void rhs_default();
  207. extern void Halt();
  208.  
  209. #define Remove(ce)    AddRemoveQ(ce)
  210. #define EXEC_Q_EMPTY        (-1)
  211. #define IGNORE            (-1)
  212.  
  213.  
  214. /* start AMEM_DEF */
  215.  
  216. typedef struct {
  217.     DLL_Entry link;
  218.     PTR rlink;
  219.     PTR mem;
  220.     WmeID wme_id;
  221. } AMem_Entry;
  222.  
  223. struct alpha_mem {
  224.     int rule;
  225.     int count;
  226.     int ra_offset;
  227.     ULONG rule_active_mask;
  228.     void (*join_code)();
  229.     AMem_Entry *mem_list;
  230.     AMem_Entry *scan_ptr;
  231. #ifndef NO_TAIL_PTR
  232.     AMem_Entry *tail;
  233. #endif
  234. };
  235.  
  236. typedef struct alpha_mem *        AMemID;
  237.  
  238.  
  239. extern void AddAMemEntry();
  240. extern void RemoveAMemEntry();
  241. extern void ClearAMem();
  242. extern WmeID scan_amem();
  243.  
  244. #ifndef NO_TAIL_PTR
  245. #define InitAMem(mem) \
  246.     (ReInitList(&((mem)->mem_list)), \
  247.     (mem)->tail = NULL, \
  248.     (mem)->scan_ptr = NULL)
  249. #else
  250. #define InitAMem(mem) \
  251.     (ReInitList(&((mem)->mem_list)), \
  252.     (mem)->scan_ptr = NULL)
  253. #endif
  254.  
  255. #define SetMask(mem) \
  256.     (mem)->scan_ptr = (mem)->mem_list
  257.  
  258. #define Retrieve(mem) \
  259.     ((WmeID) ((mem)->scan_ptr ? \
  260.         (wme_id = (mem)->scan_ptr->wme_id, \
  261.         (mem)->scan_ptr = (AMem_Entry *) (mem)->scan_ptr->link.next, \
  262.         wme_id) \
  263.     : NULL))
  264.  
  265.  
  266.  
  267. /* start AMATH_DEF */
  268.  
  269. extern void plus();
  270. extern void minus();
  271. extern void mult();
  272. extern void div();
  273. extern void mod();
  274.  
  275. extern Attr a_stack[];
  276. extern int as_ptr;
  277.  
  278.  
  279. /* start INST_H */
  280.  
  281. struct recency {
  282.     TimeTag time;
  283.     USHORT offset;
  284. };
  285.  
  286. struct instance {
  287.     DLL_Entry link;
  288.     int rule;
  289.     struct recency *time_order;
  290.     USHORT wme_count;
  291.     WmeID elements[1];
  292. };
  293.  
  294.  
  295. /* start INST_DEF */
  296.  
  297. typedef struct instance *    InstID;
  298.  
  299. extern InstID CreateInst();
  300. extern void AddWme();
  301.  
  302.  
  303. /* start CSET_DEF */
  304.  
  305. extern InstID AddInst();
  306. extern InstID FindInst();
  307. extern InstID GetFirable();
  308. extern void RemoveInst();
  309. extern BOOLEAN lex();
  310. extern BOOLEAN mea();
  311. extern BOOLEAN match_inst();
  312.  
  313.  
  314. /* start CTEST_DEF */
  315.  
  316. extern BOOLEAN eq_float();
  317. extern BOOLEAN eq_int();
  318. extern BOOLEAN eq_symbol();
  319. extern BOOLEAN ne_float();
  320. extern BOOLEAN ne_int();
  321. extern BOOLEAN ne_symbol();
  322. extern BOOLEAN gt_float();
  323. extern BOOLEAN gt_int();
  324. extern BOOLEAN lt_float();
  325. extern BOOLEAN lt_int();
  326. extern BOOLEAN ge_float();
  327. extern BOOLEAN ge_int();
  328. extern BOOLEAN le_float();
  329. extern BOOLEAN le_int();
  330.  
  331. #define is_symbol(sym)    is_at_symbolic(sym)
  332.  
  333.  
  334. /* start STRINGS_DEF */
  335.  
  336. typedef struct {
  337.     HT_Entry_Header link;
  338.     StrID str_id;
  339. } String_HT_Header;
  340.  
  341. typedef struct {
  342.     HT_Entry_Header link;
  343.     StrID str_id;
  344.     ULONG SC_offset;
  345. } CT_String_HT_Header;
  346.  
  347.  
  348. typedef String_HT_Header *StringEntry;
  349. typedef HashTable StringSpace;
  350.  
  351. extern StringEntry AddString();
  352. extern StringEntry StringAvail();
  353. extern void ST_Dump();
  354.  
  355. #define MakeStringTable(count)    ((StringSpace) MakeHashTable(count))
  356. #define ResetSTScan        ResetHTScan
  357. #define ScanST(table)        ((StringEntry) ScanHT(table))
  358. #define RemoveString(node)    (RemoveHTEntry(node))
  359. #define GetString(strid)    (((StrID)strid)->strg)
  360.  
  361.  
  362. /* start DOLLAR_DEF */
  363.  
  364. struct attr_info {
  365.     String_HT_Header st_head;
  366.     UBYTE offset;
  367. };
  368.  
  369. extern void dollar_tab2();
  370. extern void dollar_assert();
  371. extern FILE *dollar_ifile();
  372. extern FILE *dollar_ofile();
  373. extern StrID dollar_intern();
  374.  
  375. #define dollar_parameter(index)    result_element[index-1]
  376. #define dollar_parametercount()    next_re_slot
  377. #define dollar_reset()    (SetNil(result_element,MAX_WME_ATTR),next_re_slot=0)
  378. #define dollar_value(attr)    (result_element[next_re_slot++]=attr)
  379. #define dollar_str_val(value) \
  380.     (result_element[next_re_slot].type=AT_SYMBOL, \
  381.     result_element[next_re_slot++].data.string=((StrID) value))
  382. #define dollar_int_val(value) \
  383.     (result_element[next_re_slot].type=AT_INTEGER, \
  384.     result_element[next_re_slot++].data.ival=value)
  385. #define dollar_flt_val(value) \
  386.     (result_element[next_re_slot].type=AT_INTEGER, \
  387.     result_element[next_re_slot++].fval=value)
  388. #define dollar_tab1(num)    next_re_slot=num-1;
  389.  
  390. extern int dollar_litbind();
  391. extern BOOLEAN dollar_eql();
  392. extern void dollar_symbol();
  393. extern int dollar_cvan();
  394. extern Attr dollar_cvna();
  395.  
  396. #define dollar_symbol(x)        (is_at_symbolic(x))
  397. #define NOT_DEFINED    -1
  398.  
  399.  
  400. /* start FUNCTION_DEF */
  401.  
  402. extern void substr();
  403. extern void genatom();
  404. extern void litval();
  405. extern void accept();
  406. extern BOOLEAN acceptline();
  407.  
  408.  
  409. /* start JTEST_DEF */
  410.  
  411. extern BOOLEAN test_eq();
  412. extern BOOLEAN test_ne();
  413. extern BOOLEAN test_gt();
  414. extern BOOLEAN test_ge();
  415. extern BOOLEAN test_lt();
  416. extern BOOLEAN test_le();
  417. extern BOOLEAN test_same();
  418.  
  419.  
  420. /* start GLOBALS_DEF */
  421.  
  422. /**********************************************************************
  423.  * This section contains type declarations for global library variables.
  424.  **********************************************************************/
  425.  
  426. extern BOOLEAN (*resolution_function)();
  427.  
  428. extern int resolution_strategy;
  429. #define LEX        0
  430. #define MEA        1
  431.  
  432. extern BOOLEAN add_to_neg;
  433.  
  434. /* Sizes of some variable dimensioned arrays */
  435. extern int rule_count;
  436. extern int class_count;
  437. extern int call_entry_count;
  438. extern int attr_count;
  439. extern int amem_count;
  440.  
  441.  
  442. /**********************************************************************
  443.  * Result Element structures.
  444.  **********************************************************************/
  445.  
  446. #define CUR_RE_SLOT    result_element[next_re_slot]
  447.  
  448. extern Attr result_element[];
  449.  
  450. extern int next_re_slot;
  451.  
  452.  
  453. /**********************************************************************
  454.  * File I/O structures.
  455.  **********************************************************************/
  456.  
  457. /* The following structures are for keeping track of the files which
  458.  * are open. */
  459.  
  460. #define NOT_FOUND       0
  461. #define INPUT           1
  462. #define OUTPUT          2
  463.  
  464. struct file_data {
  465.         String_HT_Header link;
  466.         FILE *fptr;
  467.         int mode;
  468. };
  469.  
  470. extern StringSpace file_tab;
  471. extern struct file_data *fdptr;
  472.  
  473. /* File stream identifiers */
  474. #define ACCEPT        0
  475. #define WRITE        1
  476. #define TRACE        2
  477.  
  478. /* Default file I/O stream pointers */
  479. extern FILE *default_trace;
  480. extern FILE *default_write;
  481. extern FILE *default_accept;
  482. extern FILE *write_file;
  483. extern FILE *t_file;
  484.  
  485. /* Boolean for transcript file output */
  486. extern BOOLEAN transcript;
  487.  
  488. extern StringSpace attr_values;
  489.  
  490.  
  491. extern BOOLEAN halt_flag;
  492. extern int cycle_count;
  493. extern int delta_cycle_count;
  494.  
  495.  
  496. /**********************************************************************
  497.  * Global input buffer for use by top_level, ACCEPT, and ACCEPTLINE.
  498.  **********************************************************************/
  499.  
  500. #define INPUT_BUFFER_SIZE        512
  501.  
  502. extern char in_buff[];
  503.  
  504. extern char *lptr;
  505. extern char quote_chrs[];
  506.  
  507. extern InstID most_recent;
  508.  
  509. /**********************************************************************
  510.  * Printing support structures
  511.  **********************************************************************/
  512.  
  513. #define PBUFF_SIZE        1024
  514.  
  515. extern char pbuff[];
  516. extern int parg_cnt;
  517.  
  518. #define PARG_SIZE        20
  519.  
  520. extern char *parg[];
  521. extern int print_col;
  522.  
  523. #define PRINT_RESET    parg_cnt = 0; parg[0] = pbuff
  524.  
  525.  
  526. /**********************************************************************
  527.  * Statistical monitoring information structures
  528.  **********************************************************************/
  529.  
  530. /* This array contains restriction masks for some event tests */
  531. extern ULONG restrict[];
  532.  
  533. /* These structures contain information about activity for each event */
  534. extern struct stat stat_test[];
  535.  
  536. /* History state variable (name refers to execution stack) */
  537. extern ULONG stack_state;
  538.  
  539. extern int cnt;
  540. extern FILE *stats_out;
  541. extern USHORT s_addr;
  542. extern ULONG l_addr;
  543.  
  544.  
  545. /**********************************************************************
  546.  * Variables needed to run trace file execution of RHS
  547.  **********************************************************************/
  548.  
  549. extern FILE *trace_input;
  550. extern int trace_file_type;
  551.  
  552. /* Watch command trace level */
  553. extern int watch_level;
  554.  
  555. /* Some statistics */
  556. extern int cset_size;
  557. extern int max_cset_size;
  558. extern ULONG cset_avg_total;
  559.  
  560. extern BOOLEAN arb_select;
  561.  
  562. /**********************************************************************
  563.  * Global parameter passing block
  564.  **********************************************************************/
  565. #define MAX_FUNC_ARGS    16
  566.  
  567. extern Attr args[];
  568. extern int fargc;
  569.  
  570. /* For CBIND.  Set by dollar_assert. */
  571. extern WmeID last_assert;
  572.  
  573. /* Flags used by pbreak */
  574. extern char *pb_flag;
  575.  
  576. /*end*/
  577.  
  578. extern void read_trace();
  579.  
  580. /**********************************************************************
  581.  * Structure and Preprocessor Definitions
  582.  **********************************************************************/
  583.  
  584. struct rule_info {
  585.     char *name;
  586.     int first_ce;
  587.     UBYTE ce_count;
  588.     UBYTE test_count;
  589. };
  590.  
  591. extern struct rule_info rule[];
  592.  
  593. struct a_print_info {
  594.     StrID str_id;
  595.     int offset;
  596. };
  597.  
  598. struct class_info {
  599.     char *name;
  600.     UBYTE attr_count;
  601.     struct a_print_info *attr_info;
  602.     AMemID no_test_mem;
  603.     USHORT wme_size;
  604. };
  605.  
  606. extern struct class_info class[];
  607.  
  608. struct attr_off {
  609.     String_HT_Header link;
  610.     int offset;
  611. };
  612.  
  613. extern StringSpace attr_names;
  614.  
  615.  
  616. struct call_entry {
  617.     char *name;
  618.     void (*code)();
  619.     char flag;
  620. };
  621.  
  622. #define CE_ACTION    1
  623. #define CE_FUNCTION    2
  624.  
  625.  
  626. #define MAKE_INIT()    \
  627.     next_re_slot = 0;    \
  628.     SetNil(result_element,MAX_WME_ATTR)
  629.  
  630. #define MAKE_SET_STR_ATTR(attr_type,attr_value)    \
  631.     CUR_RE_SLOT.type = (UBYTE)attr_type;    \
  632.     CUR_RE_SLOT.data.string = (StrID)attr_value
  633.  
  634. #define MAKE_SET_INT_ATTR(attr_type,attr_value)    \
  635.     CUR_RE_SLOT.type = (UBYTE)attr_type;    \
  636.     CUR_RE_SLOT.data.ival = attr_value
  637.  
  638. #define MAKE_SET_FLT_ATTR(attr_type,attr_value)    \
  639.     CUR_RE_SLOT.type = (UBYTE)attr_type;    \
  640.     CUR_RE_SLOT.data.fval = attr_value
  641.  
  642. #define LOCAL_VARS    \
  643.     register WmeID wme_id,gi0,gi1,gi2,gi3;    \
  644.     register InstID inst_id;
  645.  
  646. #define SET_SCOPE(amem_num,ce_loc)    \
  647.     SetMask(&amem[amem_num]);    \
  648.     while (ce_loc = Retrieve(&amem[amem_num])) {
  649.  
  650. #define RESET_SCOPE(var_num,ce_loc,attr_offset)    \
  651.     var[var_num] = GetWmeAttr(ce_loc,attr_offset);
  652.  
  653. #define VTEST(var_num,attr_offset)    \
  654.     var[var_num] = GetWmeAttr(new_wme,attr_offset);
  655.  
  656. #define TEST(test_name,var_num,ce_loc,attr_offset)    \
  657.     if (!test_name(GetWmeAttr(ce_loc,attr_offset),var[var_num])) \
  658.         continue;
  659.  
  660. #define STEST(test_name,var_num,attr_offset)    \
  661.     if (!test_name(GetWmeAttr(new_wme,attr_offset),var[var_num])) \
  662.         continue;
  663.  
  664. #define FUNNEL_1(amem_no) \
  665.     SetMask(&amem[amem_no]); \
  666.     while (wme_id = Retrieve(&amem[amem_no])) { \
  667.         if (
  668.  
  669. #define FUNNEL_2 \
  670.         ) break; \
  671.     } \
  672.     if (wme_id != NULL) \
  673.         continue;
  674.  
  675.  
  676. #define FUNNEL_2B \
  677.         ) return; \
  678.     }
  679.  
  680.  
  681. #define FUNNEL_3(amem_no) \
  682.     SetMask(&amem[amem_no]); \
  683.     if (Retrieve(&amem[amem_no])) \
  684.         continue;
  685.  
  686.  
  687. #define FUNNEL_3B(amem_no) \
  688.     SetMask(&amem[amem_no]); \
  689.     if (Retrieve(&amem[amem_no])) \
  690.         return;
  691.  
  692.  
  693. #define NEG_CREATE_INST(rule_no,ce_count) \
  694.     global_inst[0] = gi0; \
  695.     global_inst[1] = gi1; \
  696.     global_inst[2] = gi2; \
  697.     global_inst[3] = gi3; \
  698.     if (add_to_neg) { \
  699.         if (inst_id = (InstID) FindNode(CSet[rule_no],match_inst)) \
  700.             RemoveInst(inst_id); \
  701.     } \
  702.     else { \
  703.         inst_id = CreateInst(rule_no); \
  704.         for (count=0; count < ce_count; count++) \
  705.             AddWme(inst_id,global_inst[count],count); \
  706.         AddInst(rule_no,inst_id); \
  707.     }
  708.  
  709. #define POS_CREATE_INST(rule_no,ce_count) \
  710.     inst_id = CreateInst(rule_no); \
  711.     global_inst[0] = gi0; \
  712.     global_inst[1] = gi1; \
  713.     global_inst[2] = gi2; \
  714.     global_inst[3] = gi3; \
  715.     for (count=0; count < ce_count; count++) \
  716.         AddWme(inst_id,global_inst[count],count); \
  717.     AddInst(rule_no,inst_id);
  718.  
  719. /**********************************************************************
  720.  * Macros for setting and testing masks in rule_active[] array
  721.  **********************************************************************/
  722.  
  723. #define BIT_MASK(x)    (1 << x)
  724.  
  725. #define START_MASK(x)    (x>32 ? ~0 : ~(~0 << x)),(x>32 ? ~(~0 << (x-32)) : 0)
  726.  
  727. #define NEG_ADD(rule,amem_no) \
  728.     if (rule_active[rule]) { \
  729.         /*printf("(NEG_ADD): Joining rule %d\n",rule);*/ \
  730.         add_to_neg = TRUE; \
  731.         (*amem[amem_no].join_code)(); \
  732.         add_to_neg = FALSE; \
  733.     }
  734.  
  735. /**********************************************************************
  736.  * Macros for code generated by WRITE
  737.  **********************************************************************/
  738.  
  739. #define PRINT                fprintf(write_file
  740. #define PRINTD                fprintf(default_write
  741.  
  742. /* returns AttrID */
  743. #define VAR_ID(ce_offset,attr_offset) \
  744.     &(most_recent->elements[ce_offset]->attr[attr_offset])
  745.  
  746. /* returns Attr */
  747. #define VAR(ce_offset,attr_offset) \
  748.     most_recent->elements[ce_offset]->attr[attr_offset]
  749.  
  750. /* returns WmeID */
  751. #define EVAR(ce_offset)    most_recent->elements[ce_offset]
  752.  
  753. /* Macros used with amath module */
  754. #define POP_STACK        a_stack[as_ptr--]
  755. #define PUSHV(var)        a_stack[++as_ptr] = var
  756. #define PUSHI(integer) \
  757.     a_stack[++as_ptr].type = AT_INTEGER; \
  758.     a_stack[as_ptr].data.ival = integer;
  759. #define PUSHF(flt) \
  760.     a_stack[++as_ptr].type = AT_FLOAT; \
  761.     a_stack[as_ptr].data.fval = flt;
  762.  
  763.  
  764. #define JOIN_STAT_BEGIN(arg)
  765. #define JOIN_STAT_END
  766.  
  767. #ifndef COERCE
  768. #define test_eq(id1,id2) \
  769.     ((id1.type==id2.type) && (id1.data.ival==id2.data.ival))
  770.  
  771. #define test_ne(id1,id2) \
  772.     ((id1.type!=id2.type) || (id1.data.ival!=id2.data.ival))
  773. #endif
  774.  
  775. /**********************************************************************
  776.  * Macros for calling external functions.
  777.  **********************************************************************/
  778. #define VAR_ARG(var_num)    args[fargc++] = var[var_num]
  779.  
  780. #define PATH_ARG(ce_offset,attr_offset) \
  781.     args[fargc++] = VAR(ce_offset,attr_offset)
  782.  
  783. #define STR_ARG(addr)    \
  784.     args[fargc].type = AT_SYMBOL;    \
  785.     args[fargc++].data.string = (StrID) addr
  786.  
  787. #define INT_ARG(value)    \
  788.     args[fargc].type = AT_INTEGER;    \
  789.     args[fargc++].data.ival = value
  790.  
  791. #define FLT_ARG(value)    \
  792.     args[fargc].type = AT_FLOAT;    \
  793.     args[fargc++].data.fval = value
  794.  
  795.  
  796. /* Used for substr function */
  797. #define INF        -1
  798.